package com.java.eight.stream;

import java.util.*;
import java.util.stream.Stream;

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;

/**
* @description: 初识Stream
* @author: xiaoliang.liu
* @date: 2018/7/8 15:48
* @version v1.0
*/
public class SimpleStream {

    public static void main(String[] args) {
        List<Dish> menu = Arrays.asList(
                new Dish("pork", false, 800, Dish.Type.MEAT),
                new Dish("beef", false, 700, Dish.Type.MEAT),
                new Dish("chicken", false, 400, Dish.Type.MEAT),
                new Dish("french fries", true, 530, Dish.Type.OTHER),
                new Dish("rice", true, 350, Dish.Type.OTHER),
                new Dish("season fruit", true, 120, Dish.Type.OTHER),
                new Dish("pizza", true, 550, Dish.Type.OTHER),
                new Dish("prawns", false, 300, Dish.Type.FISH),
                new Dish("salmon", false, 450, Dish.Type.FISH) );

        // java7之前的处理方式
//        List<String> dishNameListUseJava7 = getDishNameListUseJava7(menu);
//        System.out.println("7+"+dishNameListUseJava7);

        // java8以流的方式处理
//        List<String> dishNameListUseJava8 = getDishNameListUseJava8(menu);
//        System.out.println("8+"+dishNameListUseJava8);

        // 同一个流的一个操作不能做多次
        Stream<Dish> stream = menu.stream();
        stream.forEach(System.out::println);
//        stream.forEach(System.out::println);

    }

    /**
     * 用java7之前的方法获得集合中的名字
     * @param menu 集合
     * @return list
     */
    private static List<String> getDishNameListUseJava7 (List<Dish> menu) {
        List<Dish> lowCaloricDishes = new ArrayList<>();
        for(Dish d: menu){
            if(d.getCalories() < 400){
                lowCaloricDishes.add(d);
            }
        }
        Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
            @Override
            public int compare(Dish d1, Dish d2){
                return Integer.compare(d1.getCalories(), d2.getCalories());
            }
        });
        List<String> lowCaloricDishesName = new ArrayList<>();
        for(Dish d: lowCaloricDishes){
            lowCaloricDishesName.add(d.getName());
        }
        return lowCaloricDishesName;
    }

    /**
     * 用java8中的流方法获得集合中的名字
     * @param menu 集合
     * @return list
     */
    private static List<String> getDishNameListUseJava8 (List<Dish> menu) {
        return menu.stream().filter(d -> d.getCalories() < 400).sorted(comparing(Dish::getCalories))
                .map(Dish::getName).collect(toList());
    }
}

